#ifndef SETTINGS_H
#define SETTINGS_H

#include <string>
#include <nvs_flash.h>

/**
 * @brief 设置管理类，用于处理非易失性存储(NVS)中的配置项
 * 
 * 该类封装了ESP32 NVS功能，提供简单的接口来存储和检索配置数据
 */
class Settings {
public:
    /**
     * @brief 构造函数
     * @param ns 命名空间名称，用于隔离不同的设置组
     * @param read_write 是否以读写模式打开，默认为只读模式
     */
    Settings(const std::string& ns, bool read_write = false);
    
    /**
     * @brief 析构函数，如果有未保存的更改会自动提交
     */
    ~Settings();

    /**
     * @brief 获取字符串类型的设置值
     * @param key 设置项的键名
     * @param default_value 默认值，当键不存在时返回此值
     * @return 存储的字符串值或默认值
     */
    std::string GetString(const std::string& key, const std::string& default_value = "");
    
    /**
     * @brief 设置字符串类型的值
     * @param key 设置项的键名
     * @param value 要存储的字符串值
     */
    void SetString(const std::string& key, const std::string& value);
    
    /**
     * @brief 获取整数类型的设置值
     * @param key 设置项的键名
     * @param default_value 默认值，当键不存在时返回此值
     * @return 存储的整数值或默认值
     */
    int32_t GetInt(const std::string& key, int32_t default_value = 0);
    
    /**
     * @brief 设置整数类型的值
     * @param key 设置项的键名
     * @param value 要存储的整数值
     */
    void SetInt(const std::string& key, int32_t value);
    
    /**
     * @brief 删除指定的设置项
     * @param key 要删除的设置项的键名
     */
    void EraseKey(const std::string& key);
    
    /**
     * @brief 删除当前命名空间下的所有设置项
     */
    void EraseAll();

private:
    std::string ns_;              ///< 命名空间名称
    nvs_handle_t nvs_handle_ = 0; ///< NVS句柄
    bool read_write_ = false;     ///< 是否以读写模式打开
    bool dirty_ = false;          ///< 是否有未保存的更改
};

#endif
